// 在开发过程中，有时候需要js生成全局唯一标识符，
// 在java中可以使用uuid， 但是JS中没有现成的函数
// 总结了一下， JS生成唯一标识符的4种方法

// "a1ca0f7b-51bd-4bf3-a5d5-6a74f6adc1c7"
export function guid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    var r = (Math.random() * 16) | 0
    var v = c === 'x' ? r : (r & 0x3) | 0x8
    return v.toString(16)
  })
}

//
/**
 * @param {Boolean} flagNoLine 是否去除中间的"-"
 * @returns {String}  返回"ffb7cefd-02cb-4853-8238-c0292cf988d5"格式的uuid，
 * 如果flagNoLine为true，则返回"ffb7cefd02cb48538238c0292cf988d5"
 */
export function uuid(flagNoLine) {
  if (!flagNoLine) flagNoLine = false
  var s = []
  var hexDigits = '0123456789abcdef'
  for (var i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
  }
  // bits 12-15 of the time_hi_and_version field to 0010
  s[14] = '4'
  // bits 6-7 of the clock_seq_hi_and_reserved to 01
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1)
  s[8] = s[13] = s[18] = s[23] = '-'
  var uuid = s.join('')
  return flagNoLine ? uuid.replace(/-/g, '') : uuid
}

// "748eea29-f842-4af9-a552-e1e1aa3ed979"
export function guid2() {
  function S4() {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
  }
  return S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4()
}

/**
 * @param {Number} len 长度
 * @param {Number} radix 基数
 * @returns {String}  返回指定长度的随机字符串，例如：uuid2(16, 16) = "277571702EE33E11"
 */
export function uuid2(len, radix) {
  var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
  var uuid = []
  var i
  radix = radix || chars.length
  if (len) {
    // Compact form
    for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)]
  } else {
    // rfc4122, version 4 form
    var r
    // rfc4122 requires these characters
    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
    uuid[14] = '4'
    // Fill in random data.  At i==19 set the high bits of clock sequence as
    // per rfc4122, sec. 4.1.5
    for (i = 0; i < 36; i++) {
      if (!uuid[i]) {
        r = 0 | (Math.random() * 16)
        uuid[i] = chars[i === 19 ? (r & 0x3) | 0x8 : r]
      }
    }
  }
  return uuid.join('')
}
